package com.advanced.date;

public class HashTable {

	public static void main(String[] args) {
		/**
		 * HashTable的特点 （1）底层使用Entry数组保存元素 （2）默认初始容量是11，加载因子是0.75。
		 * （3）可以指定初始容量和加载因子。指定初始容量时即按照指定值进行容量分配。 （4）线程安全，方法使用synchronized修饰。
		 * （5）具有fail-fast的特征 （6）key和value均不允许为null，否则抛出java.lang.NullPointerException异常。
		 * （7）计算索引的方式为： int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) %
		 * tab.length; （8）如果key已经存在，则新value覆盖旧value，并返回旧value。 （9）如果超过扩容阈值threshold（数组容量
		 * * 加载因子），则进行rehash扩容。新数组容量=(原数组容量 << 1) + 1
		 * 
		 * 比较HashTable和HashMap的差异 第一，hashmap和hashtable继承的类不同
		 * 第二：所以从公开的方法上来看，这两个类提供的，是一样的功能。都提供键值映射的服务，可以增、删、查、改键值对，可以对建、值、键值对提供遍历视图。支持浅拷贝，支持序列化。
		 * 第三：hashmap支持空键空值，而hashtable如果有空键的话就会跑NullPointException异常，（因为hashmap将null的code值定为了0）
		 * 第四：hashMap不是线程同步的，但是hashTable是线程同步的，但是现在ConcurrenthashMap也是线程同步的，所以现在hashTable已经被淘汰了。
		 * 
		 * 比较TreeMap和HashMap的区别
		 * 在数组中我们是通过数组下标来对其内容索引的，而在Map中我们通过对象来对对象进行索引，用来索引的对象叫做key，其对应的对象叫做value。这就是我们平时说的键值对。
		 * 
		 * HashMap通过hashcode对其内容进行快速查找，而
		 * TreeMap中所有的元素都保持着某种固定的顺序，如果你需要得到一个有序的结果你就应该使用TreeMap（HashMap中元素的排列顺序是不固定的）。
		 * 
		 * HashMap 非线程安全 TreeMap 非线程安全
		 * 
		 * 线程安全
		 * 
		 * 在Java里，线程安全一般体现在两个方面：
		 * 
		 * 1、多个thread对同一个java实例的访问（read和modify）不会相互干扰，它主要体现在关键字synchronized。如ArrayList和Vector，HashMap和Hashtable
		 * （后者每个方法前都有synchronized关键字）。如果你在interator一个List对象时，其它线程remove一个element，问题就出现了。
		 * 
		 * 2、每个线程都有自己的字段，而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类，而没有Java关键字支持，如像static、transient那样。
		 * 
		 * 1.AbstractMap抽象类和SortedMap接口
		 * 
		 * AbstractMap抽象类：(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同，则这两个映射相等。映射的哈希码是映射元素哈希码的总和，其中每个元素是Map.Entry接口的一个实现。因此，不论映射内部顺序如何，两个相等映射会报告相同的哈希码。
		 * 
		 * SortedMap接口：（TreeMap继承自SortedMap）它用来保持键的有序顺序。SortedMap接口为映像的视图(子集)，包括两个端点提供了访问方法。除了排序是作用于映射的键以外，处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口，否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。
		 * 
		 * 2.两种常规Map实现
		 * 
		 * HashMap：基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()]，为了优化HashMap空间的使用，您可以调优初始容量和负载因子。
		 * 
		 * (1)HashMap(): 构建一个空的哈希映像 (2)HashMap(Map m): 构建一个哈希映像，并且添加映像m的所有映射
		 * (3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像 (4)HashMap(int
		 * initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
		 * 
		 * TreeMap：基于红黑树实现。TreeMap没有调优选项，因为该树总处于平衡状态。
		 * 
		 * (1)TreeMap():构建一个空的映像树 (2)TreeMap(Map m): 构建一个映像树，并且添加映像m中所有元素
		 * (3)TreeMap(Comparator c): 构建一个映像树，并且使用特定的比较器对关键字进行排序 (4)TreeMap(SortedMap s):
		 * 构建一个映像树，添加映像树s中所有映射，并且使用与有序映像s相同的比较器排序
		 * 
		 * 3.两种常规Map性能
		 * 
		 * HashMap：适用于在Map中插入、删除和定位元素。 Treemap：适用于按自然顺序或自定义顺序遍历键(key)。
		 * 
		 * 4.总结
		 * 
		 * HashMap通常比TreeMap快一点(树和哈希表的数据结构使然)，建议多使用HashMap，在需要排序的Map时候才用TreeMap。
		 * 
		 * 
		 */

	}

}
